package edu.upc.inmobile.repository.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import edu.upc.inmobile.domain.Aviso;
import edu.upc.inmobile.repository.AvisoRepository;

@Repository
public class JdbcAvisoRepository implements AvisoRepository {

	private SimpleJdbcTemplate simpleJdbcTemplate;

	@Autowired
	public JdbcAvisoRepository(DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

	// @Override
	public List<Aviso> busquedaAvisosPorEstado(String estado) {
		String sql = 
			"SELECT A.COD_AVISO, A.COD_USUARIO, A.TIPO_AVISO, A.TIPO_OFERTA, " +
			"A.ESTADO, A.COD_INMUEBLE, A.TLF_CONTAC1, A.TLF_CONTAC2, " +
			"A.PRECIO_DOL, A.DIRECCION, A.NUMERO, A.FEC_REGISTRO, A.FEC_VENCIM " +
			"FROM T_AVISO A JOIN T_INMUEBLE B ON A.COD_INMUEBLE = B.COD_INMUEBLE " +
			"JOIN T_TIPO_INMUEBLE C ON B.COD_TIPO = C.COD_TIPO " +
			"WHERE B.ESTADO = ? ORDER BY C.NOM_TIPO";
		List<Aviso> avisos = null;
		RowMapper<Aviso> mapper = new RowMapper<Aviso>() {
			public Aviso mapRow(ResultSet rs, int rowNum) throws SQLException {
				String vs_codAviso = rs.getString("COD_AVISO");
				String vs_codUsuario = rs.getString("COD_USUARIO");
				String vs_tipoAviso = rs.getString("TIPO_AVISO");
				String vs_tipoOferta = rs.getString("TIPO_OFERTA");
				String vs_estado = rs.getString("ESTADO");
				String vs_codInmueble = rs.getString("COD_INMUEBLE");
				String vs_tlfContact1 = rs.getString("TLF_CONTACT1");
				String vs_tlfContact2 = rs.getString("TLF_CONTACT2");
				double vd_precioDol = rs.getDouble("PRECIO_DOL");
				String vs_direccion = rs.getString("DIRECCION");
				String vs_numero = rs.getString("NUMERO");
				Date vs_fecRegistro = rs.getDate("FEC_REGISTRO");
				Date vs_fecVencim = rs.getDate("FEC_VENCIM");
				Aviso aviso = Aviso.creaAviso(vs_codAviso, vs_codUsuario,
						vs_tipoAviso, vs_tipoOferta, vs_estado, vs_codInmueble,
						vs_tlfContact1, vs_tlfContact2, vd_precioDol,
						vs_direccion, vs_numero, vs_fecRegistro, vs_fecVencim);
				return aviso;
			}
		};
		try {
			avisos = this.simpleJdbcTemplate.query(sql, mapper, estado);
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		
		return avisos;
	}

	public Aviso busquedaAvisoInmuebleMasVisitado() {
		System.out.println("busquedaAvisoInmuebleMasVisitado...");
		String sql = 
			"SELECT COD_AVISO, COUNT(*) FROM T_VISITAS_X_AVISO " +
			"GROUP BY COD_AVISO";
		
		Map<String, Object> resultado = null;
		try {
			resultado = this.simpleJdbcTemplate.queryForMap(sql);
		} catch (EmptyResultDataAccessException ex) {
			ex.printStackTrace();
			return null;
		}
		
		System.out.println("--RESULTADO DE QUERY 1--");
		System.out.println(resultado);
		int mayorVisitas = 0;
		String codAvisoMasVisitado = null;
		for (String codigoAviso : resultado.keySet()) {
			// Del resultado obtengo el cod_aviso con mayor contador de visitas
			
			//  if (codigo.get(codigoAviso) > mayorVisitas) {
			//  	  mayorVisitas = codigo.get(codigoAviso);
			//     codAvisoMasVisitado = codigoAviso;
			//  }
			  
			 
		}
		
		String sql2 = 
			"SELECT * FROM T_AVISO WHERE COD_AVISO = ?";
		
		Aviso aviso = null;
		RowMapper<Aviso> mapper = new RowMapper<Aviso>() {
			public Aviso mapRow(ResultSet rs, int rowNum) throws SQLException {
				String vs_codAviso = rs.getString("COD_AVISO");
				String vs_codUsuario = rs.getString("COD_USUARIO");
				String vs_tipoAviso = rs.getString("TIPO_AVISO");
				String vs_tipoOferta = rs.getString("TIPO_OFERTA");
				String vs_estado = rs.getString("ESTADO");
				String vs_codInmueble = rs.getString("COD_INMUEBLE");
				String vs_tlfContact1 = rs.getString("TLF_CONTACT1");
				String vs_tlfContact2 = rs.getString("TLF_CONTACT2");
				double vd_precioDol = rs.getDouble("PRECIO_DOL");
				String vs_direccion = rs.getString("DIRECCION");
				String vs_numero = rs.getString("NUMERO");
				Date vs_fecRegistro = rs.getDate("FEC_REGISTRO");
				Date vs_fecVencim = rs.getDate("FEC_VENCIM");
				Aviso aviso = Aviso.creaAviso(vs_codAviso, vs_codUsuario,
						vs_tipoAviso, vs_tipoOferta, vs_estado, vs_codInmueble,
						vs_tlfContact1, vs_tlfContact2, vd_precioDol,
						vs_direccion, vs_numero, vs_fecRegistro, vs_fecVencim);
				return aviso;
			}
		};
		try {
			aviso = this.simpleJdbcTemplate.queryForObject(sql2, mapper, codAvisoMasVisitado);
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		
		return aviso;
	}
	
//	@Override
	public Aviso buscarAviso(String codigo) {
		Aviso aviso = new Aviso();
		String query="SELECT COD_AVISO ,COD_USUARIO ,TIPO_AVISO ,TIPO_OFERTA ,ESTADO ,COD_INMUEBLE, " +
						"TLF_CONTAC1, TLF_CONTAC2, PRECIO_DOL, DIRECCION, NUMERO, FEC_REGISTRO, FEC_VENCIM " + 
		              "FROM T_AVISO WHERE COD_AVISO = ?";
		RowMapper<Aviso> mapper = new RowMapper<Aviso>() {
			
//			@Override
			public Aviso mapRow(ResultSet rs, int rowNum) throws SQLException {
				String codigo=rs.getString("COD_AVISO");
				String codigoUser= rs.getString("COD_USUARIO");
				String tipoAviso = rs.getString("TIPO_AVISO");
				String tipoOferta = rs.getString("TIPO_OFERTA");
				String estado = rs.getString("ESTADO");
				String codigoInmueble = rs.getString("COD_INMUEBLE");
				String tlfContac1 = rs.getString("TLF_CONTAC1");
				String tlfContac2 = rs.getString("TLF_CONTAC2");
				double precioDol= rs.getDouble("PRECIO_DOL");
				String direccion= rs.getString("DIRECCION");
				String numero = rs.getString("NUMERO");
				Date fechRegistro= rs.getDate("FEC_REGISTRO");
				Date fechVencim= rs.getDate("FEC_VENCIM");
				Aviso aviso= Aviso.creaAviso(codigo, codigoUser,
						tipoAviso, tipoOferta, estado, codigoInmueble,
						tlfContac1, tlfContac2, precioDol,
						direccion, numero, fechRegistro, fechVencim);
				return aviso;
			}
		};
		
		try{
			aviso=this.simpleJdbcTemplate.queryForObject(query, mapper, codigo);
		}catch(EmptyResultDataAccessException e){
			return null;
		}
		return aviso;
	}

//	@Override
	public void publicarAviso(Aviso aviso) {
		String query="INSERT INTO T_AVISO(COD_AVISO, COD_USUARIO, TIPO_AVISO, TIPO_OFERTA, ESTADO, COD_INMUEBLE, TLF_CONTAC1, TLF_CONTAC2, PRECIO_DOL, DIRECCION, NUMERO, FEC_REGISTRO, FEC_VENCIM) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)";
		this.simpleJdbcTemplate.update(query, aviso.getCod_aviso(),aviso.getCod_usuario(), aviso.getTipo_aviso(), aviso.getTipo_oferta(),aviso.getEstado(),
				aviso.getCod_inmueble(),aviso.getTlf_contac1(),aviso.getTlf_contac2(),aviso.getPrecio_dol(),aviso.getDireccion(),aviso.getNumero(),aviso.getFec_registro(),aviso.getFec_vencim());
		
	}

//	@Override
	public String obtenerCodigoDisponible() {
		Long codDis = 0l;
		codDis=this.simpleJdbcTemplate.queryForLong("select count(1)+1 from T_AVISO");
		return codDis.toString();
	}

}
